<?php
/**
 * Created by PhpStorm.
 * User: jojo
 * Date: 5/20/2015
 * Time: 3:01 PM
 */



class C返回堆栈
{
    private static   $instance;
    /***/
    private $dataStack;
    private $errStack;
    private function __construct(){
        $this->dataStack = array();
        $this->errStack = array();
    }

    //名字index的数组,包括位置:line和类:函数--'位置'
    //---'结果'  true false
    // --'原因'
    //---'消息'


    public static function getInstance()
    {
        if (empty(self::$instance)) {
            self::$instance = new C返回堆栈();
        }

        return self::$instance;
    }

    public function  get_最后数据()
    {
        return  $this->dataStack[array_keys($this->dataStack)[count($this->dataStack)-1]];
    }
    public function  get_最后错误()
    {
        return  $this->errStack[array_keys($this->errStack)[count($this->errStack)-1]];
    }
    public function  get_最后事件()
    {
        $rtn = null;
        foreach($this->dataStack as $data){
            if ($data instanceof C返回事件)
                $rtn = $data;
        }
        return $rtn;
    }
    public function  pop_事件()
    {
        $ipos = -1;
        for($i=0;$i<count($this->dataStack);$i++)
        {
            if ($this->dataStack[$i] instanceof C返回事件)
                $ipos = $i;
        }

        unset($this->dataStack[$ipos] );
        return 1;
    }
    /**
     * @param $data
     * @param bool $结果
     */
    //赋值,并push到stack中去;
    public function push_数据($data)
    {
        array_push($this->dataStack,$data);
    }

    /**
     * @param $data
     * @param bool $结果
     */
    //赋值,并push到stack中去;
    public function pop_数据()
    {
        array_pop($this->dataStack);
    }



    public function push_错误($data)
    {
        array_push($this->errStack,$data);
    }

    /**
     * @param $data
     * @param bool $结果
     */
    //赋值,并push到stack中去;
    public function pop_错误()
    {
        array_pop($this->errStack);
    }

    public function f返回数据是否为空()
    {
        if(count($this->dataStack)>0)
            return false;
        else
            return true;
    }

    public function f返回数据是否都是消息()
    {
        foreach( $this->dataStack as $vo)
        {
            if ($vo instanceof C返回事件)
            {
                return false;
            }
        }
        return true;
    }

    //条件  array("false == $读商家结果","该商家不存在"
    //如果出错,写错误堆栈
    public function  条件校验($conditions = array())
    {
        foreach ($conditions as $条件语句 => $错误消息) {
            if (eval("return " . $条件语句) == false) {
                $this->push_数据(array("消息" => $错误消息 . $this->caller_info(1)));

                return false;
            }
        }

        return true;
    }


    //0 是自己, 1是调用者,以此类推
    public function caller_info($who = 1)
    {
        $trace = debug_backtrace();
        $who++;


        if ($who >= count($trace)) {
            return "您查询的调用函数不存在";
        }
        $class = $trace[$who]['class'];
        $func = $trace[$who]['function'];
        $file = $trace[$who]['file'];
        $line = $trace[$who]['line'];

        if ($file != '') {
            $file = basename($file);
        }
        $c = $file . ": ";
        $c .= ($class != '') ? ":" . $class . "->" : "";
        $c .= ($func != '') ? $func . "(): " : "";
        $c .= ($line != '') ? $line . "行" : "";

        return ($c);

    }


}

class C返回事件 {
    public $vs事件;
    public $vs用户openId;
    public $vs公众号openId;
    public $vi应用表id;
    public $vo类参数;
    public $vo方法参数;
    public $事件参数;

    /**
     * @return mixed
     */
    public function getVs公众号openId()
    {
        return $this->vs公众号openId;
    }

    /**
     * @param mixed $vs公众号openId
     */
    public function setVs公众号openId($vs公众号openId)
    {
        $this->vs公众号openId = $vs公众号openId;
    }


    /**
     * @return mixed
     */
    public function getVs用户openId()
    {
        return $this->vs用户openId;
    }

    /**
     * @param mixed $vs用户openId
     */
    public function setVs用户openId($vs用户openId)
    {
        $this->vs用户openId = $vs用户openId;
    }

    /**
     * @return mixed
     */
    public function getVi应用表id()
    {
        return $this->vi应用表id;
    }

    /**
     * @param mixed $vi应用表id
     */
    public function setVi应用表id($vi应用表id)
    {
        $this->vi应用表id = $vi应用表id;
    }
    /**
     * @return mixed
     */
    public function get事件参数()
    {
        return $this->事件参数;
    }

    /**
     * @param mixed $事件参数
     */
    public function set事件参数($事件参数)
    {
        $this->事件参数 = $事件参数;
    }

    /**
     * @return mixed
     */
    public function getVs事件()
    {
        return $this->vs事件;
    }

    /**
     * @param mixed $vs事件
     */
    public function setVs事件($vs事件)
    {
        $this->vs事件 = $vs事件;
    }


    /**
     * @return mixed
     */
    public function getVo类参数()
    {
        return $this->vo类参数;
    }

    /**
     * @param mixed $vo类参数
     */
    public function setVo类参数($vo类参数)
    {
        $this->vo类参数 = $vo类参数;
    }

    /**
     * @return mixed
     */
    public function getVo方法参数()
    {
        return $this->vo方法参数;
    }

    /**
     * @param mixed $vo方法参数
     */
    public function setVo方法参数($vo方法参数)
    {
        $this->vo方法参数 = $vo方法参数;
    }


}

class C返回信息 {
    public $消息类型;   //"文本消息""图文消息"
    public $消息内容;
    public $用户OpenId;
    public $公众号Id;      //1、2
    public $公众号OpenId;

    /**
     * @return mixed
     */
    public function get消息类型()
    {
        return $this->消息类型;
    }

    /**
     * @param mixed $消息类型
     */
    public function set消息类型($消息类型)
    {
        $this->消息类型 = $消息类型;
    }

    /**
     * @return mixed
     */
    public function get消息内容()
    {
        return $this->消息内容;
    }

    /**
     * @param mixed $消息内容
     */
    public function set消息内容($消息内容)
    {
        $this->消息内容 = $消息内容;
    }

    /**
     * @return mixed
     */
    public function get用户OpenId()
    {
        return $this->用户OpenId;
    }

    /**
     * @param mixed $用户OpenId
     */
    public function set用户OpenId($用户OpenId)
    {
        $this->用户OpenId = $用户OpenId;
    }

    /**
     * @return mixed
     */
    public function get公众号Id()
    {
        return $this->公众号Id;
    }

    /**
     * @param mixed $公众号Id
     */
    public function set公众号Id($公众号Id)
    {
        $this->公众号Id = $公众号Id;
    }

    /**
     * @return mixed
     */
    public function get公众号OpenId()
    {
        return $this->公众号OpenId;
    }

    /**
     * @param mixed $公众号OpenId
     */
    public function set公众号OpenId($公众号OpenId)
    {
        $this->公众号OpenId = $公众号OpenId;
    }


}

class C返回信息多类型 {
    public $消息类型;   //'video','voice','image','text'
    public $消息内容;
    public $用户OpenId;
    public $公众号Id;      //1、2
    public $公众号OpenId;
    public $media_id;
    public $PicUrl;
    public $Format;
    public $ThumbMediaId;

    /**
     * @return mixed
     */
    public function get消息类型()
    {
        return $this->消息类型;
    }

    /**
     * @param mixed $消息类型
     */
    public function set消息类型($消息类型)
    {
        $this->消息类型 = $消息类型;
    }

    /**
     * @return mixed
     */
    public function get消息内容()
    {
        return $this->消息内容;
    }

    /**
     * @param mixed $消息内容
     */
    public function set消息内容($消息内容)
    {
        $this->消息内容 = $消息内容;
    }

    /**
     * @return mixed
     */
    public function get用户OpenId()
    {
        return $this->用户OpenId;
    }

    /**
     * @param mixed $用户OpenId
     */
    public function set用户OpenId($用户OpenId)
    {
        $this->用户OpenId = $用户OpenId;
    }

    /**
     * @return mixed
     */
    public function get公众号Id()
    {
        return $this->公众号Id;
    }

    /**
     * @param mixed $公众号Id
     */
    public function set公众号Id($公众号Id)
    {
        $this->公众号Id = $公众号Id;
    }

    /**
     * @return mixed
     */
    public function get公众号OpenId()
    {
        return $this->公众号OpenId;
    }

    /**
     * @param mixed $公众号OpenId
     */
    public function set公众号OpenId($公众号OpenId)
    {
        $this->公众号OpenId = $公众号OpenId;
    }

    /**
     * @return mixed
     */
    public function getmedia_id()
    {
        return $this->media_id;
    }

    /**
     * @param mixed $media_id
     */
    public function setmedia_id($media_id)
    {
        $this->media_id = $media_id;
    }

    /**
     * @return mixed
     */
    public function getPicUrl()
    {
        return $this->PicUrl;
    }

    /**
     * @param mixed $PicUrl
     */
    public function setPicUrl($PicUrl)
    {
        $this->PicUrl = $PicUrl;
    }

    /**
     * @return mixed
     */
    public function getFormat()
    {
        return $this->Format;
    }

    /**
     * @param mixed $Format
     */
    public function setFormat($Format)
    {
        $this->Format = $Format;
    }

    /**
     * @return mixed
     */
    public function getThumbMediaId()
    {
        return $this->ThumbMediaId;
    }

    /**
     * @param mixed $ThumbMediaId
     */
    public function setThumbMediaId($ThumbMediaId)
    {
        $this->ThumbMediaId = $ThumbMediaId;
    }

}


class C返回错误 {
    public $公众号id;//比如公众号
    public $消息类型;//比如文本还是图文等
    public $消息内容;

    /**
     * @return mixed
     */
    public function get应用表id()
    {
        return $this->公众号id;
    }

    /**
     * @param mixed $公众号id
     */
    public function set应用表id($公众号id)
    {
        $this->公众号id = $公众号id;
    }

    /**
     * @return mixed
     */
    public function get消息类型()
    {
        return $this->消息类型;
    }

    /**
     * @param mixed $消息类型
     */
    public function set消息类型($消息类型)
    {
        $this->消息类型 = $消息类型;
    }

    /**
     * @return mixed
     */
    public function get消息内容()
    {
        return $this->消息内容;
    }

    /**
     * @param mixed $消息内容
     */
    public function set消息内容($消息内容)
    {
        $this->消息内容 = $消息内容;
    }

}

